//
//  Problem1684.swift
//  TestProject
//
//  Created by 武侠 on 2021/3/15.
//  Copyright © 2021 zhulong. All rights reserved.
//

import UIKit

/*
 1684. 统计一致字符串的数目 【字符包含】
 给你一个由不同字符组成的字符串 allowed 和一个字符串数组 words 。如果一个字符串的每一个字符都在 allowed 中，就称这个字符串是 一致字符串 。

 请你返回 words 数组中 一致字符串 的数目。

 示例 1：
     输入：allowed = "ab", words = ["ad","bd","aaab","baa","badab"]
     输出：2
     解释：字符串 "aaab" 和 "baa" 都是一致字符串，因为它们只包含字符 'a' 和 'b' 。
 示例 2：
     输入：allowed = "abc", words = ["a","b","c","ab","ac","bc","abc"]
     输出：7
     解释：所有字符串都是一致的。
 示例 3：
     输入：allowed = "cad", words = ["cc","acd","b","ba","bac","bad","ac","d"]
     输出：4
     解释：字符串 "cc"，"acd"，"ac" 和 "d" 是一致字符串。

 提示：
     1 <= words.length <= 104
     1 <= allowed.length <= 26
     1 <= words[i].length <= 10
     allowed 中的字符 互不相同 。
     words[i] 和 allowed 只包含小写英文字母。
 */
@objcMembers class Problem1684: NSObject {
    func solution() {
        print(countConsistentStrings("ab", ["ad","bd","aaab","baa","badab"]))
        print(countConsistentStrings("abc", ["a","b","c","ab","ac","bc","abc"]))
        print(countConsistentStrings("cad", ["cc","acd","b","ba","bac","bad","ac","d"]))
    }
    
    func countConsistentStrings(_ allowed: String, _ words: [String]) -> Int {
        var charsDic: [Character:Int] = [:]
        for c in allowed {
            charsDic[c] = 1
        }
        
        var result = words.count
        for str in words {
            for c in str {
                if charsDic[c] == nil {
                    result -= 1
                    break
                }
            }
        }
        return result
    }
    
    func countConsistentStringsSet(_ allowed: String, _ words: [String]) -> Int {
        let allowedSet = Set(allowed)
        var result = words.count
        
        for word in words {
            for c in word {
                if !allowedSet.contains(c) {
                    result -= 1
                    break
                }
            }
        }
        return result
    }
}
